﻿#include "elementreader.h"
#include <QDebug>
#include <QXmlStreamReader>

elementReader* elementReader::reader=nullptr;

elementReader::elementReader()
{

}
QVector3D getvecfromstring(QString str)
{
    QStringList vl=str.split(" ");
    if(vl.size()==3)
    {
        return QVector3D(vl.at(0).toDouble(),vl.at(1).toDouble(),vl.at(2).toDouble());
    }
    else
        return QVector3D();
}
void elementReader::getInitilizationFile(QString file)
{
    QFile xmlfile(file);
    if(!xmlfile.exists())
    {
        qDebug()<<"can not find xml file"<<file;
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&xmlfile))
    {
        qDebug()<<"this is not a xml file";
        return;
    }
    int t=file.lastIndexOf("/");
    filedir=file.left(t);
    configfile=file;

    QDomElement root=doc.documentElement();
//    qDebug()<<"root == "<<root.nodeName();
    QDomNodeList list=root.childNodes();
    qDebug()<<"child count == "<<list.size();
    for(int i=0;i<list.count();++i)
    {
        QString nodname=list.at(i).nodeName();
        if(nodname=="#comment")
        {
             continue;
        }
        JOINT jt;
        QDomElement element=list.at(i).toElement();
        jt.Name=element.attribute("name");

        if(nodname=="Frame")
        {
             jt.type=Fixed;
             jt.min=0;
             jt.max=0;
             jt.vellimet=0;
             jt.acclimit=0;
        }
        if(nodname=="Joint")
        {
             jt.type= Revolute;
        }
        QDomNodeList jlist=element.childNodes();
        for(int j=0;j<jlist.size();++j)
        {
             QDomNode node=jlist.at(j);
             QString nodename=node.nodeName();
             //qDebug()<<nodename;
             if(nodename=="parent")
             {
                 jt.prenode = node.childNodes().at(0).nodeValue().trimmed();
             }
             if(nodename=="RPY")
             {
                 QString rpystr=node.childNodes().at(0).nodeValue().trimmed();
                 jt.rpy = getvecfromstring(rpystr);
             }
             if(nodename=="Pos")
             {
                 QString posstr=node.childNodes().at(0).nodeValue().trimmed();
                 jt.pos = getvecfromstring(posstr);
             }
             if(nodename=="PosLimit")
             {
                jt.min = node.toElement().attribute("min").toInt();
                jt.max = node.toElement().attribute("max").toInt();
             }
             if(nodename == "VelLimit")
             {
                jt.vellimet = node.toElement().attribute("max").toInt();
             }
             if(nodename == "AccLimit")
             {
                jt.acclimit = node.toElement().attribute("max").toInt();
             }
             if(nodename == "Drawable")
             {
                QDomNodeList sublist=node.childNodes();
                MoD mo;
                mo.name = node.toElement().attribute("name");
                for(int k=0;k<sublist.size();++k)
                {
                    QDomNode subnode=sublist.at(k);
                    QString substring=subnode.nodeName();
                    qDebug()<<substring;
                    if(substring=="RPY")
                    {
                        QString rpystr=subnode.childNodes().at(0).nodeValue().trimmed();
                        mo.rpy = getvecfromstring(rpystr);
                    }
                    if(substring=="Pos")
                    {
                        QString posstr=subnode.childNodes().at(0).nodeValue().trimmed();
                        mo.pos = getvecfromstring(posstr);
                    }
                    if(substring=="Link")
                    {
                        mo.path=filedir+"/"+subnode.toElement().attribute("file");
                    }
                    if(substring=="Color")
                    {
                        QStringList colorlist = subnode.firstChild().nodeValue().trimmed().split(" ");
                        mo.color = QVector4D(colorlist.at(0).toDouble(),colorlist.at(1).toDouble(),colorlist.at(2).toDouble(),colorlist.at(3).toDouble());
                    }
                }
                jt.modelpath.append(mo);
             }
        }
        jmap[jt.Name]=jt;
    }
}

QString elementReader::getfiledir()
{
    qDebug()<<configfile;
    return filedir;
}

void elementReader::readconfig()
{
}
